Operating systems control the allocation and usage of hardware resources associated with a computer system. Typically, an operating system has a list of events that might occur while a software program associated with the operating system is executing. When one of the listed events occurs, the operating system sends a signal to the program indicating the occurrence of the event. For example, the functionality of a software program may depend on an expiration of a certain amount of time such as in the situation where a program allows a certain amount of time for a user to enter an input. If the user fails to enter the input within the certain amount of time, then the operating system detects a timer alarm indicating that the time period has expired. In response, the operating system transmits an event signal indicating that the time for entering the input has expired. By processing the event signal, the program becomes aware that the user has failed to enter the input.
Usually, the operating system will only transmit an event signal when the program has a corresponding signal handler capable of handling the event signal. A signal handler is a portion of a software program that processes event signals from the operating system. The operating system typically has knowledge of which signal handlers are contained in a program and, hence, which event signals can be processed by the program. Therefore, upon detecting an occurrence of a timer alarm event, for example, the operating system will first determine whether the computer program has a signal handler designed to process an event signal corresponding to the timer alarm. If such a signal handler exists, the operating system will transmit a timer alarm event signal to the program.
Upon receiving an event signal, the program will invoke the signal handler capable of handling the event signal. The signal handler then takes the necessary steps so that the program may continue executing in an appropriate manner in view of the occurrence of the associated event. If no signal handler exists to handle the event signal, then the operating system refrains from transmitting the event signal.
There are times during the execution of the program that it is desirable for the program not to receive certain event signals from the operating system. For example, a portion of the program may enter a critical region where the processing of certain event signals causes errors to occur. In this regard, the program may enter into a region where certain data is accessed and manipulated. In processing a particular event, the signal handler may also access and manipulate certain data. As can be appreciated by one skilled in the art, if the signal handler interrupts the execution of the critical region of the program and manipulates data that is currently being accessed and manipulated by the program, an error can occur. Therefore, it is desirable to block certain event signals from occurring when the program enters a critical region where, for example, certain data would be manipulated by both the program and the signal handler if certain events occur.
In order to block certain event signals from occurring, the program sends a system call to the operating system requesting the operating system to block a particular event signal from occurring. In response, the operating system typically indicates that the particular event signal is blocked by setting a particular flag corresponding to the event signal. When an event occurs, the operating system checks the appropriate flag to determine if the corresponding event signal has been blocked. If the flag is not set, then the event signal is not blocked, and the operating system delivers the event signal to the program. However, if the flag is set, indicating that the event signal is blocked, then the operating system refrains from sending the event signal. Instead, the operating system simply notes that the event occurred and that the corresponding event signal was blocked.
After blocking an event signal by the foregoing procedures, it may be desirable for the program to unblock the event signal. For example, the program may leave the critical portion of the program and, therefore, no longer need the event signal to be blocked. In order to unblock the blocked event signal, the program sends another system call to the operating system requesting the operating system to unblock the blocked event signal. At this point, the operating system clears the flag corresponding to the blocked event signal so that any future occurrences of the corresponding event will result in the delivery of an event signal to the program. Furthermore, after unblocking the event signal, the operating system also determines if the event signal was previously attempted but blocked during the blocking period. If so, the operating system transmits a signal to the program indicating the occurrence of the corresponding event, and the program processes the signal accordingly.
Although the blocking and unblocking process outlined hereinabove successfully prevents the occurrence of an event signal during the execution of particular portions of the program, the blocking and unblocking process is very costly to the efficient operation of many applications. Each system call usually requires the machine state of the operating system to be saved and usually requires the operating system to transition from a lower to higher privileged mode of operation. Therefore, the performance of programs having a high frequency of blocking and unblocking system calls is significantly degraded.
Thus, a heretofore unaddressed need exists in the industry for providing a system and method of efficiently blocking and unblocking event signals associated with an operating system.